package com.rp.dao.local;

import java.util.Calendar;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.rp.dao.IProdutoDAO;
import com.rp.dao.ResultSetProcessor;
import com.rp.model.Produto;

public class ProdutoLDAO implements IProdutoDAO {
    private Context context;

    public ProdutoLDAO(Context context) {
	this.context = context;
    }

    private static final String DB_NAME = "DB_RP";

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IProdutoDAO#criarTabela1()
     */
    @Override
    public void criarTabela1() throws Throwable {
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    BancoDados.execSQL("CREATE TABLE IF NOT EXISTS produto ("
		    + "nome TEXT, ean INTEGER, data_alteracao INTEGER);");
	} finally {
	    BancoDados.close();
	}
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IProdutoDAO#insereProduto(com.rp.model.Produto)
     */
    @Override
    public void insereProduto(Produto produto) throws Throwable {
	String nome = produto.getNome();
	long codigo = produto.getCodigo();
	long dataAlteracao = produto.getDataAlteracao();
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    BancoDados
		    .execSQL("INSERT INTO produto (nome,ean,data_alteracao) VALUES('"
			    + nome + "'," + codigo + "," + dataAlteracao + ");");
	} finally {
	    BancoDados.close();
	}
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IProdutoDAO#buscarPorCodigoBarras(java.lang.String)
     */
    @Override
    public Produto buscarPorCodigoBarras(long codigoEan) throws Throwable {
	Produto p = null;
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    Cursor cursor = BancoDados.rawQuery(
		    "SELECT * FROM produto where ean = " + codigoEan + ";",
		    null);
	    try {
		if (cursor.moveToNext()) {
		    String nome = cursor.getString(0);
		    codigoEan = cursor.getLong(1);
		    long data = cursor.getLong(2);
		    p = new Produto(nome, codigoEan, data);
		}
	    } finally {
		cursor.close();
	    }
	} finally {
	    BancoDados.close();
	}
	return p;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IProdutoDAO#countId0()
     */
    @Override
    public long count(Calendar data) throws Throwable {
	Produto p = null;
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    Cursor cursor = BancoDados.rawQuery(
		    "SELECT count(*) FROM produto where data_alteracao > "
			    + data.getTimeInMillis() + ";", null);
	    try {
		if (cursor.moveToNext()) {
		    long count = cursor.getInt(0);
		    return count;
		}
	    } finally {
		cursor.close();
	    }
	} finally {
	    BancoDados.close();
	}
	return 0;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IProdutoDAO#getPendentesEnviar()
     */
    @Override
    public ResultSetProcessor<Produto> getPendencias(Calendar data)
	    throws Throwable {
	Produto p = null;
	final SQLiteDatabase BancoDados = context.openOrCreateDatabase(DB_NAME,
		Context.MODE_WORLD_READABLE, null);
	final Cursor cursor = BancoDados.rawQuery(
		"SELECT * FROM produto where data_alteracao > "
			+ data.getTimeInMillis() + ";", null);
	return new ResultSetProcessor<Produto>() {
	    @Override
	    public Produto process() throws Throwable {
		Produto produto = null;
		if (cursor.moveToNext()) {
		    String nome = cursor.getString(0);
		    long codigo = cursor.getLong(1);
		    long data = cursor.getLong(2);
		    produto = new Produto(nome, codigo, data);
		} else {
		    cursor.close();
		    BancoDados.close();
		}
		return produto;
	    }
	};
    }
}
